//
// Created by QU on 2024/1/21.
//

#include <iostream>
#include <string>
#include <list>
#include <vector>
#include <map>
#include <set>

// boost library
#include <boost/core/ignore_unused.hpp>

// using namespace
using std::cin, std::cout, std::endl;
using std::string;

using boost::ignore_unused;

// 编写代码的时候总会遇到一些暂时用不到但是有必须要进行保留的变量, GCC等编译器将会对这样的产生警告, 使用-Wunused 可以关闭这些警告信息,
// 但是-Wunused也可能让我们的代码存在一些风险.

// 有一些古老的方法, 比如使用(void)var来使用一下这个变量, 但是怎么看都不利于维护.
// Boost有这样的一个小组件, 就是完成用一下(准确来说是骗过编译器)

// ignore_unused在boost命名空间, 需要引入<boost/core/ignore_unused.hpp>

// 实现
/*
template <typename ... Ts>
inline void ignore_unused(Ts const & ...){}
*/
// 使用可变参数模板, 支持任意类型的数量和任意变量类型的变量, 把他们作为函数的参数"使用"了一下, 从而骗过编译器, 达到(void)var相同的效果.
// 而且命名更加清晰, 写法相对简单, 而且使用的是inline函数, 运行时没有任何性能损失. (编译可能有一点)

/*
int func(int x, int y){
    int i;
    return y;
}
*/

// 在编译的时候会有警告出现: 变量i没有使用.
//     warning: unused variable 'i' [-Wunused-variable]
//     warning: unused parameter 'x' [-Wunused-parameter]
// 在使用了ignore_unused后

// 基本用法
int func(int x, int y){
    int i;
    boost::ignore_unused(i, x);         // 这里假装使用了两个变量, 2333.

    return y;
}

// 模板用法
/*
template <typename ... Ts>
inline void ignore_unused(){}       // 注意没有参数列表.
*/

//ignore_unused库的模板用法与函数的用法类似, 但是他不需要函数列表, 而是在模板参数列表中写出需要忽略的值
void func2(){
    typedef int result_type;
    //  warning: typedef 'result_type' locally defined but not used [-Wunused-local-typedefs]

    // 加上类型ignore_unused模板
    boost::ignore_unused<result_type >();       // 没有警告了.
}

int main(int argc, char const *argv[]){
    boost::ignore_unused(argc, argv);       // main param unused.

}

